package com.allm.ai.common.repository;

import com.allm.ai.common.entity.ImportRecord;
import com.allm.ai.common.entity.ImportRecord.ImportStatus;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 导入记录数据访问层
 * 
 * @author com.enplatform.assistant
 * @since 1.0.0
 */
@Repository
public interface ImportRecordRepository extends JpaRepository<ImportRecord, String> {

    /**
     * 根据状态查询导入记录
     */
    List<ImportRecord> findByStatus(ImportStatus status);

    /**
     * 根据状态分页查询导入记录
     */
    Page<ImportRecord> findByStatus(ImportStatus status, Pageable pageable);

    /**
     * 根据文件名查询导入记录
     */
    List<ImportRecord> findByFileName(String fileName);

    /**
     * 根据文件哈希值查询导入记录（用于去重）
     */
    Optional<ImportRecord> findByFileHash(String fileHash);

    /**
     * 根据向量集合名称查询导入记录
     */
    List<ImportRecord> findByVectorCollection(String vectorCollection);

    /**
     * 根据创建时间范围查询导入记录
     */
    List<ImportRecord> findByCreatedAtBetween(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查询最近的导入记录
     */
    List<ImportRecord> findTop10ByOrderByCreatedAtDesc();

    /**
     * 查询正在处理中的导入记录
     */
    @Query("SELECT ir FROM ImportRecord ir WHERE ir.status = 'PROCESSING' ORDER BY ir.startTime ASC")
    List<ImportRecord> findProcessingRecords();

    /**
     * 查询成功的导入记录数量
     */
    @Query("SELECT COUNT(ir) FROM ImportRecord ir WHERE ir.status = 'SUCCESS'")
    long countSuccessfulImports();

    /**
     * 查询失败的导入记录数量
     */
    @Query("SELECT COUNT(ir) FROM ImportRecord ir WHERE ir.status = 'FAILED'")
    long countFailedImports();

    /**
     * 查询总处理记录数
     */
    @Query("SELECT COALESCE(SUM(ir.totalRecords), 0) FROM ImportRecord ir WHERE ir.status = 'SUCCESS'")
    long sumTotalRecords();

    /**
     * 查询总成功记录数
     */
    @Query("SELECT COALESCE(SUM(ir.successRecords), 0) FROM ImportRecord ir WHERE ir.status = 'SUCCESS'")
    long sumSuccessRecords();

    /**
     * 根据时间范围统计导入记录
     */
    @Query("SELECT ir.status, COUNT(ir), COALESCE(SUM(ir.totalRecords), 0), COALESCE(SUM(ir.successRecords), 0) " +
           "FROM ImportRecord ir " +
           "WHERE ir.createdAt BETWEEN :startTime AND :endTime " +
           "GROUP BY ir.status")
    List<Object[]> getStatisticsByTimeRange(@Param("startTime") LocalDateTime startTime, 
                                          @Param("endTime") LocalDateTime endTime);

    /**
     * 查询平均处理时间
     */
    @Query("SELECT AVG(ir.processingTimeMs) FROM ImportRecord ir WHERE ir.status = 'SUCCESS' AND ir.processingTimeMs IS NOT NULL")
    Double getAverageProcessingTime();

    /**
     * 删除指定时间之前的记录（用于数据清理）
     */
    void deleteByCreatedAtBefore(LocalDateTime cutoffTime);

    /**
     * 查询指定状态的记录数量
     */
    long countByStatus(ImportStatus status);

    /**
     * 查询今日导入记录
     */
    @Query("SELECT ir FROM ImportRecord ir WHERE FUNCTION('DATE', ir.createdAt) = CURRENT_DATE ORDER BY ir.createdAt DESC")
    List<ImportRecord> findTodayImports();
}
